home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / include / asm-xtensa / bitops.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-24  |  2.8 KB  |  122 lines

  1. /*
  2.  * include/asm-xtensa/bitops.h
  3.  *
  4.  * Atomic operations that C can't guarantee us.Useful for resource counting etc.
  5.  *
  6.  * This file is subject to the terms and conditions of the GNU General Public
  7.  * License.  See the file "COPYING" in the main directory of this archive
  8.  * for more details.
  9.  *
  10.  * Copyright (C) 2001 - 2007 Tensilica Inc.
  11.  */
  12.  
  13. #ifndef _XTENSA_BITOPS_H
  14. #define _XTENSA_BITOPS_H
  15.  
  16. #ifdef __KERNEL__
  17.  
  18. #ifndef _LINUX_BITOPS_H
  19. #error only <linux/bitops.h> can be included directly
  20. #endif
  21.  
  22. #include <asm/processor.h>
  23. #include <asm/byteorder.h>
  24. #include <asm/system.h>
  25.  
  26. #ifdef CONFIG_SMP
  27. # error SMP not supported on this architecture
  28. #endif
  29.  
  30. #define smp_mb__before_clear_bit()    barrier()
  31. #define smp_mb__after_clear_bit()    barrier()
  32.  
  33. #include <asm-generic/bitops/atomic.h>
  34. #include <asm-generic/bitops/non-atomic.h>
  35.  
  36. #if XCHAL_HAVE_NSA
  37.  
  38. static inline unsigned long __cntlz (unsigned long x)
  39. {
  40.     int lz;
  41.     asm ("nsau %0, %1" : "=r" (lz) : "r" (x));
  42.     return lz;
  43. }
  44.  
  45. /*
  46.  * ffz: Find first zero in word. Undefined if no zero exists.
  47.  * bit 0 is the LSB of addr; bit 32 is the LSB of (addr+1).
  48.  */
  49.  
  50. static inline int ffz(unsigned long x)
  51. {
  52.     return 31 - __cntlz(~x & -~x);
  53. }
  54.  
  55. /*
  56.  * __ffs: Find first bit set in word. Return 0 for bit 0
  57.  */
  58.  
  59. static inline int __ffs(unsigned long x)
  60. {
  61.     return 31 - __cntlz(x & -x);
  62. }
  63.  
  64. /*
  65.  * ffs: Find first bit set in word. This is defined the same way as
  66.  * the libc and compiler builtin ffs routines, therefore
  67.  * differs in spirit from the above ffz (man ffs).
  68.  */
  69.  
  70. static inline int ffs(unsigned long x)
  71. {
  72.     return 32 - __cntlz(x & -x);
  73. }
  74.  
  75. /*
  76.  * fls: Find last (most-significant) bit set in word.
  77.  * Note fls(0) = 0, fls(1) = 1, fls(0x80000000) = 32.
  78.  */
  79.  
  80. static inline int fls (unsigned int x)
  81. {
  82.     return 32 - __cntlz(x);
  83. }
  84.  
  85. #else
  86.  
  87. /* Use the generic implementation if we don't have the nsa/nsau instructions. */
  88.  
  89. # include <asm-generic/bitops/ffs.h>
  90. # include <asm-generic/bitops/__ffs.h>
  91. # include <asm-generic/bitops/ffz.h>
  92. # include <asm-generic/bitops/fls.h>
  93.  
  94. #endif
  95.  
  96. #include <asm-generic/bitops/fls64.h>
  97. #include <asm-generic/bitops/find.h>
  98. #include <asm-generic/bitops/ext2-non-atomic.h>
  99.  
  100. #ifdef __XTENSA_EL__
  101. # define ext2_set_bit_atomic(lock,nr,addr)                \
  102.     test_and_set_bit((nr), (unsigned long*)(addr))
  103. # define ext2_clear_bit_atomic(lock,nr,addr)                \
  104.     test_and_clear_bit((nr), (unsigned long*)(addr))
  105. #elif defined(__XTENSA_EB__)
  106. # define ext2_set_bit_atomic(lock,nr,addr)                \
  107.     test_and_set_bit((nr) ^ 0x18, (unsigned long*)(addr))
  108. # define ext2_clear_bit_atomic(lock,nr,addr)                \
  109.     test_and_clear_bit((nr) ^ 0x18, (unsigned long*)(addr))
  110. #else
  111. # error processor byte order undefined!
  112. #endif
  113.  
  114. #include <asm-generic/bitops/hweight.h>
  115. #include <asm-generic/bitops/lock.h>
  116. #include <asm-generic/bitops/sched.h>
  117. #include <asm-generic/bitops/minix.h>
  118.  
  119. #endif    /* __KERNEL__ */
  120.  
  121. #endif    /* _XTENSA_BITOPS_H */
  122.